package com.example;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "com.example.mapper")
public class SpringShiroApplication {

    /**
     * @Autowired 注入的默认规则
     * 匹配方式	                    说明
     * 优先按类型注入	                只要容器中有一个匹配类型的 Bean，就注入成功
     * 如果同类型有多个	            再尝试按变量名或 @Qualifier 名称匹配
     * 可配合 @Qualifier 精确指定	    用于多 Bean 情况下明确选定
     * <p></p>
     * @Qualifier("beanName") 的作用只是指定要注入的 Bean 名称
     * 它本身不具备注入能力
     * 真正执行注入动作的是 @Autowired
     */
//    @Autowired
//    @Qualifier("getDefaultWebSecurityManager")
//    public DefaultWebSecurityManager defaultWebSecurityManager;

    /**
     * 使用 @Resource（按名字注入）
     *
     * @Resource 是 JSR-250 标准注解，默认按名称注入，如果找不到会再尝试按类型。
     * @Resource(name = "getDefaultWebSecurityManager")
     * public DefaultWebSecurityManager getDefaultWebSecurityManager;
     */

    public static void main(String[] args) {
        SpringApplication.run(SpringShiroApplication.class, args);
    }

}
/**
 * @Autowired 和 @Resource 都是用于依赖注入的注解：
 * @Autowired 默认按类型注入，当容器中存在多个同类型 Bean 时，会尝试按参数名或字段名作为 Bean 名称进行二次匹配；此时若仍不唯一，可结合 @Qualifier("beanName") 明确指定所需注入的 Bean。
 * @Qualifier 只能配合 @Autowired 使用，用于指定要注入的 Bean 名称，本身不具备注入能力。
 * @Resource 是 JSR-250 标准注解，默认是按名称注入，若找不到匹配的 Bean 名称，会退回按类型注入。可以通过 @Resource(name = "beanName") 手动指定 Bean 名称。
 * 综上，当容器中存在多个相同类型的 Bean 时，使用 @Autowired 时建议配合 @Qualifier；使用 @Resource 时，只需指定 name 即可。
 * <p></p>
 * Spring 注入一个依赖（无论是字段、构造器、方法参数）时遵循以下规则：
 * @Autowired注入步骤:
 * 步骤        匹配依据	                                说明
 * 1	    按类型匹配	                            最优先，只要类型唯一，参数名随便写都能注入成功
 * 2	    按参数名匹配 Bean 名称	                    仅在类型不唯一（即有多个同类 Bean）时，会尝试用参数名匹配 Bean 名称
 * 3	    使用 @Qualifier 或 @Primary 明确指定	    最推荐，用于多 Bean 情况下指定注入目标
 * @Resource注入步骤:
 * 步骤        匹配方式	                说明
 * 1️⃣	    按名称注入	            默认使用字段名或参数名作为 Bean 名称查找
 * 2️⃣	    找不到时按类型注入	        如果没有找到匹配的名称，再尝试按类型匹配（且必须唯一）
 * 3️⃣	    有多个类型冲突时注入失败	不支持 @Primary 或 @Qualifier 解决歧义，必须指定 name
 */
